/*
 * @Description: 天气查询工具，根据城市名称获取天气预报信息
 * @Author: 莫若省
 * @date: 2025/9/3
 *
 * 功能说明：
 * 1. 支持通过城市名称或城市+区名称查询天气
 * 2. 返回未来多天的天气预报信息
 * 3. 包含温度、天气状况、风力、空气质量等信息
 * 4. 适配新的API响应格式
 */

import { MCPToolInterface } from "../../types/index.js";
import { z } from "zod";
import axios from "axios";

// 天气查询工具生成器
const weatherToolGenerator = (): MCPToolInterface => ({
    name: "天气查询",
    description: "根据城市名称或城市+区名称查询天气预报信息，返回未来多天的天气数据，包括温度、天气状况、风力、空气质量等",
    prams: {
        city: z.string().describe("请输入要查询天气的城市名称或城市+区名称，例如：北京、上海市浦东新区、广州天河区等"),
    },
    cb: async ({ city }) => {
        // 检查城市名称是否为空
        if (!city || city.trim() === "") {
            return {
                content: [{
                    text: "请输入有效的城市名称或城市+区名称",
                    type: "text"
                }]
            };
        }

        try {
            // 构建API请求URL - 这里需要替换为实际的新API地址
            const apiUrl = `https://api.iyuns.com/api/weather?city=${encodeURIComponent(city)}`;

            // 发送HTTP请求获取天气数据
            const response = await axios.get(apiUrl, {
                timeout: 10000, // 10秒超时
                headers: {
                    'Accept': 'application/json',
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
                }
            });

            // 检查响应状态和数据格式
            if (response.status !== 200 || response.data?.code !== 200) {
                return {
                    content: [{
                        text: response.data?.msg || `天气API请求失败，状态码: ${response.status}`,
                        type: "text"
                    }]
                };
            }

            const weatherData = response.data.data;

            // 验证数据格式
            if (!weatherData || !Array.isArray(weatherData.data)) {
                return {
                    content: [{
                        text: "天气API返回数据格式不正确",
                        type: "text"
                    }]
                };
            }

            // 格式化响应数据
            return formatWeatherResponse(weatherData);

        } catch (error) {
            console.error("天气查询错误:", error);

            // 处理不同类型的错误
            let errorMessage = "天气查询失败，请稍后重试";

            if (axios.isAxiosError(error)) {
                if (error.code === 'ECONNABORTED') {
                    errorMessage = "天气查询请求超时，请检查网络连接";
                } else if (error.response) {
                    errorMessage = error.response.data?.msg || `天气API服务异常，状态码: ${error.response.status}`;
                } else if (error.request) {
                    errorMessage = "无法连接到天气服务，请检查网络连接";
                }
            }

            return {
                content: [{
                    text: errorMessage,
                    type: "text"
                }]
            };
        }
    }
});

// 格式化天气响应
function formatWeatherResponse(weatherData: {
    city: string;
    data: Array<{
        air_quality: string;
        date: string;
        temperature: string;
        weather: string;
        wind: string;
    }>;
}) {
    // 构建详细的天气信息文本
    let weatherText = `${weatherData.city}天气信息：\n\n`;

    weatherData.data.forEach((day, index) => {
        weatherText += `日期: ${day.date}\n`;
        weatherText += `温度: ${day.temperature}\n`;
        weatherText += `天气: ${day.weather}\n`;
        weatherText += `风力: ${day.wind}\n`;
        weatherText += `空气质量: ${day.air_quality}\n`;

        if (index < weatherData.data.length - 1) {
            weatherText += "\n";
        }
    });

    return {
        content: [
            {
                text: weatherText,
                type: "text"
            }
        ]
    };
}

export const weather_tool = weatherToolGenerator;